package com.ruoyi.common.config.mybatis;

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import org.springframework.context.annotation.Bean;

/**
 * @Classname InterceptorConfig
 * @Author: sunluquan
 * @Date: 2021/12/17 16:07
 * @Description TODO
 * mybatis拦截器配置
 * 指定当前配置对象不被代理 提高初始化性能
 */
//@Configuration(proxyBeanMethods = false)
public class InterceptorConfig {

    /**
     * 配置sql语句拦截器  使用 MybatisPlusInterceptor 封装好的拦截器进行注册
     * MybatisPlusInterceptor 如何生效 详情请见  ${@link com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration}
     * 原理是MybatisPlusInterceptor 继承了 mybatis原生的 interceptor 并拦截了所有阶段 如下所示
     * Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
     * ParameterHandler (getParameterObject, setParameters)
     * ResultSetHandler (handleResultSets, handleOutputParameters)
     * StatementHandler (prepare, parameterize, batch, update, query)
     * 并拦截了CRUD操作 且在ybatisPlusInterceptor内部自己定义了一个 ${@link InnerInterceptor} 作为内部拦截器
     * 且可以通过继承  JsqlParserSupport 判断 sql语句的类型
     * 注册sql拦截器
     * @return
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){

        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        //添加乐观锁sql拦截器
        mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        mybatisPlusInterceptor.addInnerInterceptor(new DeleteInnerInterceptor());

        return mybatisPlusInterceptor;
    }
}
